﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Anagramme.Contracts
{
    /// <summary>
    /// Callback pour le service du lobby
    /// </summary>
    public interface ILobbyServiceCallback
    {
        /// <summary>
        /// Indique que le mode de jeu à changer
        /// </summary>
        /// <param name="gameMode">Nouveau mode de jeu</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyChangeGameMode(GameModes gameMode);

        /// <summary>
        /// Indique que la longueur maximale des mots à changer
        /// </summary>
        /// <param name="length">Nouvelle longueur maximale</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyChangeMaxWordsLength(int length);

        /// <summary>
        /// Indique que la longueur minimale des mots à changer.
        /// </summary>
        /// <param name="length">Nouvelle longueur minimale</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyChangeMinWordsLength(int length);

        /// <summary>
        /// Indique que le nombre de rounds cible à changer
        /// </summary>
        /// <param name="targetRounds">Nouveau nombre de rounds cible</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyChangeTargetRounds(int targetRounds);

        /// <summary>
        /// Indique que le score cible à changer
        /// </summary>
        /// <param name="targetScore">Nouveau score cible</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyChangeTargetScore(int targetScore);

        /// <summary>
        /// Indique que le serveur à été arrêté
        /// </summary>
        [OperationContract(IsOneWay = true, IsTerminating = true)]
        void ResponseLobbyDisconnect();

        /// <summary>
        /// Réponse suite à une demande des informations sur le lobby
        /// </summary>
        /// <param name="infos">Informations sur le lobby</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyInfos(LobbyInfo infos);

        /// <summary>
        /// Réponse suite à une demande de rejoindre le lobby
        /// </summary>
        /// <param name="token">Jeton de la session nécessaire à la connexion des autres services</param>
        /// <remarks>Si la demande à été refusée, le paramètre <paramref name="token"/> renvoyé vaut <see cref="Guid.Empty"/></remarks>
        [OperationContract(IsOneWay = true, IsInitiating = true)]
        void ResponseLobbyJoin(Guid token);

        /// <summary>
        /// Indique que les joueur doivent charger la partie
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyLoadGame();
        
        /// <summary>
        /// Réponse suite à une demande des informations concernant le joueur du client
        /// </summary>
        /// <param name="player">Joueur du client</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyPlayerInfo(Player player);

        /// <summary>
        /// Indique que le statut "Prêt" d'un joueur à changer.
        /// </summary>
        /// <param name="playerId">Identifiant du joueur concerné</param>
        /// <param name="isReadyToPlay">Nouveau statut "Prêt"</param>
        /// <remarks><paramref name="isReadyToPlay"/> vaut True si le joueur est Prêt, sinon False</remarks>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyPlayerIsReadyToPlay(int playerId, bool isReadyToPlay);

        /// <summary>
        /// Indique qu'un nouveau joueur à rejoint le lobby
        /// </summary>
        /// <param name="player">Information sur le joueur ayant rejoint le lobby</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyPlayerJoin(Player player);

        /// <summary>
        /// Indique qu'un joueur à quitter le lobby
        /// </summary>
        /// <param name="playerId">Identifiant du joueur ayant quitté le lobby</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyPlayerLeave(int playerId);

        /// <summary>
        /// Réponse suite à une demande de la liste des joueurs du lobby
        /// </summary>
        /// <param name="players">Liste des joueurs du lobby</param>
        [OperationContract(IsOneWay = true)]
        void ResponseLobbyPlayers(IEnumerable<Player> players);
    }
}
